#ifndef RESOURCE_MANAGER_H
#define RESOURCE_MANAGER_H

#include <string>
#include <filesystem>
#include <vector>
#include <mutex>
#include <ctime>
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <sys/stat.h>
#include <grp.h>

#include "MyShellNamespace.h"
#include "Trie.h"

MY_SHELL_NAMESPACE_BEGIN
class ResourceManager
{
private:
    // 私有成员变量
    // 用于判断当前的根路径是否存在或是否是一个目录
    bool if_root_path_legal;
public:
    // 公有成员变量
    // 根路径
    std::filesystem::path root_path;
    // 当前路径下所有文件的字典树
    myds::Trie* files_trie;
    // 当前路径下的所有文件夹
    std::vector<std::string> cur_folders;
    // 当前路径下的所有普通文件
    std::vector<std::string> cur_regular_files;
    // 当前路径下的所有隐藏文件
    std::vector<std::string> cur_others;
public:
    // 构造及析构方法
    // 默认构造
    ResourceManager();
    // 根据所给的当前路径字符串构造
    ResourceManager(const std::string& cur_path, bool if_report_error = true);
    // 默认析构
    ~ResourceManager();
public:
    // 公有清除、查找文件的方法
    // 清空当前路径下的所有查找到的文件名的数组、字典树
    void clearCurFiles();
    // 查找当前路径下的所有文件名
    void findFiles();
public:
    // 公有静态方法
    // 根据新路径字符串，查找该路径下的所有文件名，存储到一个字符串数组中并返回
    static std::vector<std::string> createFilesArrayFromRootPath(const std::string& new_path);
public:
    // 公有辅助方法
    // 修改当前根路径为new_pah，返回是否修改成功
    bool changeRootPath(const std::string& new_path);
    // 根据所给前缀，在字典树中查找所有该前缀的后缀
    std::vector<std::string> getSuffix(const std::string& prefix);
public:
    // 公有打印方法
    // 打印当前所有文件名
    void printCurrentAllFiles();
    // 以长列表形式打印当前所有文件名并显示所有文件的信息
    void printCurrentFilesInList();
};
MY_SHELL_NAMESPACE_END

#endif // ! RESOURCE_MANAGER_H